#include <gtest/gtest.h>
#include "../mqserver/mq_route.hpp"
int main()
{
    //routine : news.music.#, binding : news.music.pop
    std::cout << mq_zxws::Router::route(mq_zxws::ExchangeType::TOPIC, 
    "news.music.pop", "news.music.#") << "\n";
    return 0;
}
// class init : public testing::Environment
// {
// public:
//     virtual void SetUp() override
//     {
//     }
//     virtual void TearDown() override
//     {
//     }
// };

// TEST(router, legalroutine)
// {
//     std::string s1 = "news.music.,pop";
//     std::string s2 = "news.music*.pop";
//     std::string s3 = "news.music_123.pop";
//     std::string s4 = "news.music..pop";
//     std::string s5 = "news.*.#.pop";
//     ASSERT_EQ(mq_zxws::Router::isLegalRoutine(s1), false);
//     ASSERT_EQ(mq_zxws::Router::isLegalRoutine(s2), false);
//     ASSERT_EQ(mq_zxws::Router::isLegalRoutine(s3), true);
//     ASSERT_EQ(mq_zxws::Router::isLegalRoutine(s4), true);
//     ASSERT_EQ(mq_zxws::Router::isLegalRoutine(s5), false);
// }
// TEST(router, legalbinding)
// {
//     std::string s1 = "news.music.pop";
//     std::string s2 = "news.music*.pop"; //
//     std::string s3 = "news.music#.pop"; //
//     std::string s4 = "news.music..pop";
//     std::string s5 = "news.*.#.pop"; //
//     std::string s6 = "news.*.*.pop"; //
//     std::string s7 = "news.*.#.pop"; //
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s1), true);
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s2), false);
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s3), false);
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s4), true);
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s5), false);
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s6), true);
//     ASSERT_EQ(mq_zxws::Router::isLegalBinding(s7), false);
// }
// // [测试⽤例]
// // binding key routing key result
// // aaa                        aaa                     true
// // aaa.bbb                    aaa.bbb                 true
// // aaa.bbb                    aaa.bbb.ccc             false
// // aaa.bbb                    aaa.ccc                 false
// // aaa.#.bbb                  aaa.bbb.ccc             false
// // aaa.bbb.#                  aaa.ccc.bbb             false
// // #.bbb.ccc                  aaa.bbb.ccc.ddd         false
// // aaa.bbb.ccc                aaa.bbb.ccc             true
// // aaa.*                      aaa.bbb                 true
// // aaa.*.bbb                  aaa.bbb.ccc             false
// // *.aaa.bbb                  aaa.bbb                 false
// // #                          aaa.bbb.ccc             true
// // aaa.#                      aaa.bbb                 true
// // aaa.#                      aaa.bbb.ccc             true
// // aaa.#.ccc                  aaa.ccc                 true
// // aaa.#.ccc                  aaa.bbb.ccc             true
// // aaa.#.ccc                  aaa.aaa.bbb.ccc         true
// // #.ccc                      ccc                     true
// // #.ccc                      aaa.bbb.ccc             true
// // aaa.#.ccc.ccc              aaa.bbb.ccc.ccc.ccc     true
// // aaa.#.bbb.*.bbb            aaa.ddd.ccc.bbb.eee.bbb true
// TEST(router, Route)
// {
//     std::vector<std::string> a = {
//         "aaa",
//         "aaa.bbb",
//         "aaa.bbb",
//         "aaa.bbb",
//         "aaa.#.bbb",
//         "aaa.bbb.#",
//         "#.bbb.ccc",
//         "aaa.bbb.ccc",
//         "aaa.*",
//         "aaa.*.bbb",
//         "*.aaa.bbb",
//         "#",
//         "aaa.#",
//         "aaa.#",
//         "aaa.#.ccc",
//         "aaa.#.ccc",
//         "aaa.#.ccc",
//         "#.ccc",
//         "#.ccc",
//         "aaa.#.ccc.ccc",
//         "aaa.#.bbb.*.bbb"};
//     std::vector<std::string> b = {
//         "aaa",
//         "aaa.bbb",
//         "aaa.bbb.ccc",
//         "aaa.ccc",
//         "aaa.bbb.ccc",
//         "aaa.ccc.bbb",
//         "aaa.bbb.ccc.ddd",
//         "aaa.bbb.ccc",
//         "aaa.bbb",
//         "aaa.bbb.ccc",
//         "aaa.bbb",
//         "aaa.bbb.ccc",
//         "aaa.bbb",
//         "aaa.bbb.ccc",
//         "aaa.ccc",
//         "aaa.bbb.ccc",
//         "aaa.aaa.bbb.ccc",
//         "ccc",
//         "aaa.bbb.ccc",
//         "aaa.bbb.ccc.ccc.ccc",
//         "aaa.ddd.ccc.bbb.eee.bbb"
//     };
//     std::vector<bool> c = {
//         true,
//         true,
//         false,
//         false,
//         false,
//         false,
//         false,
//         true,
//         true,
//         false,
//         false,
//         true,
//         true,
//         true,
//         true,
//         true,
//         true,
//         true,
//         true,
//         true,
//         true
//     };
//     for(int i = 0; i < a.size(); i++){
//         std::cout << i << " : " << a[i] << " " << b[i] << "\n";
//         ASSERT_EQ(mq_zxws::Router::route(mq_zxws::ExchangeType::TOPIC, b[i], a[i]), c[i]);
//     }
// }
// int main(int argc, char *argv[])
// {
//     testing::InitGoogleTest(&argc, argv);
//     testing::AddGlobalTestEnvironment(new init);
//     int res = RUN_ALL_TESTS();
//     return 0;
// }